package charpter02_thread_safe.lession06_thread_safe;

import java.util.concurrent.TimeUnit;

/**
 *
 * 我们在实际开发中经常会遇到线程不安全的情况，那么一共有哪 3 种典型的线程安全问题呢？
 *
 * 1、运行结果错误；
 * 2、发布和初始化导致线程安全问题；
 * 3、活跃性问题。
 *      a.死锁
 *      b.活锁 ： 活锁与死锁非常相似，也是程序一直等不到结果，但对比于死锁，活锁是活的，什么意思呢？因为正在运行的线程并没有阻塞，它始终在运行中，却一直得不到结果
 *      c.饥饿 ： 指线程需要某些资源时始终得不到，尤其是CPU 资源，就会导致线程一直不能运行而产生的问题
 */
public class MyDeadLock {

    private final Object object1 =  new Object();
    private final Object object2 =  new Object();

    public static void main(String[] args) {
        MyDeadLock myDeadLock = new MyDeadLock();
        Object object1 = myDeadLock.object1;
        Object object2 = myDeadLock.object2;
        new Thread(() -> {
            while (true) {
                synchronized (object1) {
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (object2) {
                        System.out.println("code 1");
                    }
                }
            }
        }).start();
        new Thread(() ->{
            while (true) {
                synchronized (object2) {
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (object1) {
                        System.out.println("code 2");
                    }
                }
            }
        }).start();
    }
}
